library(readr)  # Do wczytywania CSV
library(naniar) # Do analizy brakujących danych

# Wczytanie danych
data <- read_csv("sklep_rowerowy.csv")
## Rows: 1000 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (8): Marital Status, Gender, Education, Occupation, Home Owner, Commute ...
## dbl (5): ID, Income, Children, Cars, Age
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Podgląd danych
head(data)
## # A tibble: 6 × 13
##      ID `Marital Status` Gender Income Children Education       Occupation    
##   <dbl> <chr>            <chr>   <dbl>    <dbl> <chr>           <chr>         
## 1 12496 Married          Female  40000        1 Bachelors       Skilled Manual
## 2 24107 Married          Male    30000        3 Partial College Clerical      
## 3 14177 Married          Male    80000        5 Partial College Professional  
## 4 24381 Single           <NA>    70000        0 Bachelors       Professional  
## 5 25597 Single           Male    30000        0 Bachelors       Clerical      
## 6 13507 Married          Female  10000        2 Partial College Manual        
## # ℹ 6 more variables: `Home Owner` <chr>, Cars <dbl>, `Commute Distance` <chr>,
## #   Region <chr>, Age <dbl>, `Purchased Bike` <chr>
# Liczba brakujących wartości w każdej kolumnie
library(naniar)
library(ggplot2)


n_miss(data)
## [1] 53
# Wizualizacja brakujących danych
vis_miss(data, sort = TRUE, warn_large_data = FALSE, show_perc = TRUE) +
  labs(
    title = "Wizualizacja brakujących danych",
    subtitle = "Zawiera procent braków w poszczególnych kolumnach"
  ) +
  theme_minimal() + # Minimalny motyw dla lepszej czytelności
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text.x = element_text(angle = 45, hjust = 1)
  ) +
  scale_fill_manual(
    values = c("#28B463","#FF5733"), # Kolor dla danych brakujących i obecnych
    name = "Status danych",          # Tytuł legendy
    labels = c("Obecne", "Brakujące") # Opis w legendzie
  )
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.

gg_miss_upset(
  data, 
  nsets = 13, 
  main.bar.color = "Pink",      # Kolor głównego paska
  sets.bar.color = "Violet"       # Kolor pasków dla zestawów
)

ggplot(data = data, aes(x = Income, y = Age)) +
  geom_point(color = "grey70", size = 3) +      # Punkty dla kompletnych danych
  geom_miss_point(size = 3) +                  # Punkty dla braków
  scale_color_manual(
    values = c("darkorange", "cyan4"),         # Kolory dla obecnych i brakujących
    name = "Status danych",                    # Tytuł legendy
    labels = c("Obecne", "Brakujące")          # Etykiety w legendzie
  ) +
  theme_minimal() +
  facet_wrap(~ Region, scales = "free") +      # Grupowanie według Regionu
  labs(
    title = "Brakujące dane w relacji Income i Age",
    subtitle = "Podział na regiony",
    x = "Dochód",
    y = "Wiek"
  )
## Warning: Removed 13 rows containing missing values or values outside the scale range
## (`geom_point()`).

# Tworzenie wykresu z geom_miss_point
ggplot(data, aes(x = Income, y = Age)) +
  geom_miss_point() +
  labs(
    title = "Brakujące wartości w danych",
    subtitle = "Analiza powiązań braków pomiędzy Income i Age",
    x = "Dochód",
    y = "Wiek"
  ) +
  theme_minimal()

gg_miss_fct(data, fct = Gender)

gg_miss_fct(data, fct = Region)

gg_miss_fct(data, fct = Education)

# Wypełnienie braków danych

library(dlookr)
## Registered S3 methods overwritten by 'dlookr':
##   method          from  
##   plot.transform  scales
##   print.transform scales
## 
## Dołączanie pakietu: 'dlookr'
## Następujący obiekt został zakryty z 'package:base':
## 
##     transform
library(VIM)
## Ładowanie wymaganego pakietu: colorspace
## Ładowanie wymaganego pakietu: grid
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
## 
## Dołączanie pakietu: 'VIM'
## Następujący obiekt został zakryty z 'package:datasets':
## 
##     sleep
data_withoutNA <- hotdeck(data)   # Funkcja hotdeck uzupełnia braki danych

n_miss(data_withoutNA)            # Ponowne sprawdzenie czy w danych są braki
## [1] 0
data_withoutNA <- hotdeck(data, imp_var = FALSE) #Poprawienie funkcji hotdeck
#Ustawienie zasad dla poszczególnych zmiennych
library(editrules)
## Ładowanie wymaganego pakietu: igraph
## 
## Dołączanie pakietu: 'igraph'
## Następujące obiekty zostały zakryte z 'package:stats':
## 
##     decompose, spectrum
## Następujący obiekt został zakryty z 'package:base':
## 
##     union
## 
## Dołączanie pakietu: 'editrules'
## Następujące obiekty zostały zakryte z 'package:igraph':
## 
##     blocks, normalize
library(dplyr)
## 
## Dołączanie pakietu: 'dplyr'
## Następujący obiekt został zakryty z 'package:editrules':
## 
##     contains
## Następujące obiekty zostały zakryte z 'package:igraph':
## 
##     as_data_frame, groups, union
## Następujące obiekty zostały zakryte z 'package:stats':
## 
##     filter, lag
## Następujące obiekty zostały zakryte z 'package:base':
## 
##     intersect, setdiff, setequal, union
# Zmieniamy spacje w nagłówkach na kropki
colnames(data) <- gsub(" ", ".", colnames(data))
colnames(data_withoutNA) <- gsub(" ", ".", colnames(data_withoutNA))
colnames(data_withoutNA)
##  [1] "ID"               "Marital.Status"   "Gender"           "Income"          
##  [5] "Children"         "Education"        "Occupation"       "Home.Owner"      
##  [9] "Cars"             "Commute.Distance" "Region"           "Age"             
## [13] "Purchased.Bike"
Rule <- editset(c(
  "ID > 0",
  "Marital.Status %in% c( 'Married', 'Single')",
  "Gender %in% c( 'Male', 'Female')",
  "Income > 0",
  "Children >= 0",
  "Education %in% c('Bachelors', 'Partial College', 'High School', 'Partial High School', 'Graduate Degree')",
  "Occupation %in% c('Skilled Manual', 'Clerical', 'Professional', 'Manual', 'Management')",
  "Home.Owner %in% c('Yes', 'No')",
  "Cars >= 0",
  "Commute.Distance %in% c('0-1 Miles', '1-2 Miles', '10+ Miles', '2-5 Miles', '5-10 Miles')",
  "Region %in% c('Europe', 'Pacific', 'North America')",
  "Age > 0",
  "Age <= 120",
  "Purchased.Bike %in% c('Yes', 'No')"
))
Rule
## 
## Data model:
## dat1 : Commute.Distance %in% c('0-1 Miles', '1-2 Miles', '10+ Miles', '2-5 Miles', '5-10 Miles')
## dat2 : Education %in% c('Bachelors', 'Graduate Degree', 'High School', 'Partial College', 'Partial High School')
## dat3 : Gender %in% c('Female', 'Male')
## dat4 : Home.Owner %in% c('No', 'Yes')
## dat5 : Marital.Status %in% c('Married', 'Single')
## dat6 : Occupation %in% c('Clerical', 'Management', 'Manual', 'Professional', 'Skilled Manual')
## dat7 : Purchased.Bike %in% c('No', 'Yes')
## dat8 : Region %in% c('Europe', 'North America', 'Pacific') 
## 
## Edit set:
## num1 : 0 < ID
## num2 : 0 < Income
## num3 : 0 <= Children
## num4 : 0 <= Cars
## num5 : 0 < Age
## num6 : Age <= 120
library(validate)
## 
## Dołączanie pakietu: 'validate'
## Następujący obiekt został zakryty z 'package:dplyr':
## 
##     expr
## Następujące obiekty zostały zakryte z 'package:igraph':
## 
##     compare, hierarchy
## Następujący obiekt został zakryty z 'package:ggplot2':
## 
##     expr
## Następujący obiekt został zakryty z 'package:naniar':
## 
##     all_complete
violations <- violatedEdits(Rule, data_withoutNA)
summary(violations)
## No violations detected, 0 checks evaluated to NA
## NULL
library(knitr)

if (sum(violations) == 0) {
  kable(
    data.frame(Wynik = "Wszystkie reguły zostały spełnione. Brak błędów."),
    col.names = "Podsumowanie",
    align = "c"
  )
} else {
  print(summary(violations))
}
Podsumowanie
Wszystkie reguły zostały spełnione. Brak błędów.
## Instalowanie pakietu w 'C:/Users/Zuzanna/AppData/Local/R/win-library/4.4'
## (ponieważ 'lib' nie jest określony)
## pakiet 'janitor' został pomyślnie rozpakowany oraz sumy MD5 zostały sprawdzone
## 
## Pobrane pakiety binarne są w
##  C:\Users\Zuzanna\AppData\Local\Temp\Rtmp6H95VU\downloaded_packages
## 
## Dołączanie pakietu: 'janitor'
## Następujące obiekty zostały zakryte z 'package:stats':
## 
##     chisq.test, fisher.test

Wykresy

## Instalowanie pakietu w 'C:/Users/Zuzanna/AppData/Local/R/win-library/4.4'
## (ponieważ 'lib' nie jest określony)
## pakiet 'plotly' został pomyślnie rozpakowany oraz sumy MD5 zostały sprawdzone
## 
## Pobrane pakiety binarne są w
##  C:\Users\Zuzanna\AppData\Local\Temp\Rtmp6H95VU\downloaded_packages
## 
## Dołączanie pakietu: 'plotly'
## Następujący obiekt został zakryty z 'package:igraph':
## 
##     groups
## Następujący obiekt został zakryty z 'package:ggplot2':
## 
##     last_plot
## Następujący obiekt został zakryty z 'package:stats':
## 
##     filter
## Następujący obiekt został zakryty z 'package:graphics':
## 
##     layout

Wykres przedstawia zależność pomiędzy odległością od miejsca pracy a decyzją o zakupie roweru. Na osi poziomej (X) przedstawiono odległości od miejsca pracy w milach, a na osi pionowej (Y) liczba osób, które zdecydowały się na zakup roweru. Najwięcej osób, które zakupiło rower, mieszkało w odległości 0-1 mil od pracy. Liczba zakupu rowerów spada w grupie osób mieszkających 1-2 mile od pracy, podobna wartość zauważalna jest dla osób mieszkających w odległości 5-10 mil od pracy. Natomiast osoby mieszkające w przedziale 2-5 mil częściej decydowały się na zakup roweru w porównaniu do dwóch poprzednio omawianych przedziałów odległości. Osoby mieszkające ponad 10 mil od miejsca pracy najrzadziej decydowały się na zakup roweru. Należy zatem skupić się na klientach, którzy pokonują krótkie odległości do pracy. Jednakże nie warto jest się zamykać tylko i wyłącznie na tą grupę i warto wprowadzić dostosowane akcje marketingowe, które miałyby na celu uświadamianie o udogodnieniach wynikających z korzystania z rowerów na średnie dystanse dojazdu do pracy w celu zwiększenia sprzedaży.

## Warning: pakiet 'plotly' jest w użyciu i nie zostanie zainstalowany

Wykres przedstawia liczbę zakupów rowerów w podziale na typ zawodu oraz płeć klientów. Na osi poziomej (X) znajduje się typ zawodu (Clerical, Management, Manual, Professional, Skilled Manual), a na osi pionowej (Y) liczba osób, które kupiły rower. Słupki w kolorze różowym reprezentują kobiety, a niebieskim – mężczyzn. Największa liczba zakupów rowerów pochodzi od osób pracujących w zawodach z kategorii “professional” (zarówno wśród kobiet, jak i mężczyzn), przy czym mężczyźni dominują liczbowo. Druga największa grupa to osoby pracujące w zawodach manualnych z wysokimi kwalifikacjami, przy stosunkowo równomiernym podziale między kobiety a mężczyzn. Zakupy w tych grupach zawodowych są wyraźnie niższe niż w grupach “Professional” i “Skilled Manual”. W zawodach clerical (biurowych) zauważalna jest niewielka przewaga kobiet. W grupie osób zatrudnionych w typie “management” obserwuje się nnajmniejszą liczbę zakupów rowerów wśród kobiet i mężczyzn, może to wynikać z tego, że osoby na wyższym stanowisku wolą przemieszczać się samochodami.

## [1] 241
## [1] 240
## [1] 481
## [1] 50.10395
## [1] 49.89605

#Utworzenie histogramu - zależność między wiekiem, a zakupem roweru
library(ggplot2)
library(dplyr)

wykres_4 <- ggplot(zbior, aes(age)) +
  geom_histogram(binwidth = 5, fill = "red", color = "black") +
  labs(title = "Zakup raweru w zależności do wieku", x = "Wiek", y = "Zakup roweru") +
  theme_minimal()

wykres_4

##Utworzenie wykresu słupkowego - zależność między regionem, a zakupem roweru
library(ggplot2)
library(dplyr)

wykres_5 <- ggplot(zbior, aes(region)) +
  geom_bar(fill = "pink", color = "lightgreen") +
  labs(title = "Zakup raweru w zależności do regionu zamieszkania", x = "Region", y = "Zakup roweru") +
  theme_minimal()

wykres_5

#Utworzenie boxplota - zakup roweru względem zarobków
library(ggplot2)
library(dplyr)

wykres_6 <- ggplot(zbior, aes(x = purchased_bike, y = income)) +
    geom_boxplot(fill = "lightblue", color = "darkblue") +
  labs(title = "Zakup roweru z zleżności od zarobków", 
       x = "Zakup roweru", 
       y = "Zarobki") +
  theme_minimal()

wykres_6

#Utworzenie boxplota - zakup roweru względem zarobków z odstającymi wartościami

wykres_7 <- ggplot(zbior, aes(x = purchased_bike, y = income)) +
    geom_boxplot(outlier.color = "red", outlier.shape = 8) +
  labs(title = "Zakup roweru z zleżności od zarobków z odstającymi wartościami", 
       x = "Zakup roweru", 
       y = "Zarobki") +
  theme_minimal()

wykres_7